package com.my.study.config;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * RabbitMQ配置类
 *
 * @author: yidujun
 * @create: 2021/03/16 10:47
 */
@Configuration
public class RabbitConfig {

    //=================== 普通队列 模式  ====================

    /**
     * 定义一个名为demoQueue的Queue普通MQ队列
     *
     * @return 名为demoQueue的Queue普通MQ队列
     */
    @Bean
    public Queue demoString() {
        return new Queue("demoQueue");
    }

    //=================== fanout广播模式  ====================

    /**
     * 定义一个名为fanout.a的Queue队列
     *
     * @return 名为fanout.a的Queue队列
     */
    @Bean
    public Queue fanoutA() {
        return new Queue("fanout.a");
    }

    /**
     * 定义一个名为fanout.b的Queue队列
     *
     * @return 名为fanout.b的Queue队列
     */
    @Bean
    public Queue fanoutB() {
        return new Queue("fanout.b");
    }

    /**
     * 定义一个名为fanout.c的Queue队列
     *
     * @return 名为fanout.c的Queue队列
     */
    @Bean
    public Queue fanoutC() {
        return new Queue("fanout.c");
    }

    /**
     * 定义一个名为fanoutExchange的交换机
     *
     * @return 名为fanoutExchange的交换机
     */
    @Bean
    FanoutExchange fanoutExchange() {
        return new FanoutExchange("fanoutExchange");
    }

    /**
     * 将定义的fanoutA队列与fanoutExchange交换机绑定
     *
     * @return
     */
    @Bean
    public Binding bindingExchangeWithA() {
        return BindingBuilder.bind(fanoutA()).to(fanoutExchange());
    }

    /**
     * 将定义的fanoutB队列与fanoutExchange交换机绑定
     *
     * @return
     */
    @Bean
    public Binding bindingExchangeWithB() {
        return BindingBuilder.bind(fanoutB()).to(fanoutExchange());
    }

    /**
     * 将定义的fanoutC队列与fanoutExchange交换机绑定
     *
     * @return
     */
    @Bean
    public Binding bindingExchangeWithC() {
        return BindingBuilder.bind(fanoutC()).to(fanoutExchange());
    }

    //=================== topic主题模式  ====================

    /**
     * 定义一个名为topic.a的Queue队列
     *
     * @return 名为topic.a的Queue队列
     */
    @Bean
    public Queue topicA() {
        return new Queue("topic.a");
    }

    /**
     * 定义一个名为topic.b的Queue队列
     *
     * @return 名为topic.b的Queue队列
     */
    @Bean
    public Queue topicB() {
        return new Queue("topic.b");
    }

    /**
     * 定义一个名为topic.c的Queue队列
     *
     * @return 名为topic.c的Queue队列
     */
    @Bean
    public Queue topicC() {
        return new Queue("topic.c");
    }

    /**
     * 定义个topic交换器
     *
     * @return 名为topicExchange交换器
     */
    @Bean
    TopicExchange topicExchange() {
        return new TopicExchange("topicExchange");
    }

    /**
     * 将定义的topicA队列与topicExchange交换机绑定
     *
     * @return
     */
    @Bean
    public Binding bindingTopicExchangeWithA() {
        // with()里面定义的是模糊匹配规则
        // 只会接收包含topic.msg的消息
        return BindingBuilder.bind(topicA()).to(topicExchange()).with("topic.msg");
    }

    /**
     * 将定义的topicB队列与topicExchange交换机绑定
     *
     * @return
     */
    @Bean
    public Binding bindingTopicExchangeWithB() {
        // 只会接收以topic开头的消息
        return BindingBuilder.bind(topicB()).to(topicExchange()).with("topic.#");
    }

    /**
     * 将定义的topicC队列与topicExchange交换机绑定
     *
     * @return
     */
    @Bean
    public Binding bindingTopicExchangeWithC() {
        // 只会接收以topic.x.z的消息，x指代任意字符
        return BindingBuilder.bind(topicC()).to(topicExchange()).with("topic.*.z");
    }

//    @Bean
//    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
//        RabbitTemplate template = new RabbitTemplate(connectionFactory);
//        template.setMessageConverter(new Jackson2JsonMessageConverter());
//        return template;
//    }
//
//    @Bean
//    public RabbitListenerContainerFactory<?> rabbitListenerContainerFactory(ConnectionFactory connectionFactory) {
//        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
//        factory.setConnectionFactory(connectionFactory);
//        factory.setMessageConverter(new Jackson2JsonMessageConverter());
//        return factory;
//    }
}
